/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package look.elements;

import CommonTools.Actions;
import CommonTools.Admin;
import CommonTools.AdminComboBoxModel;
import CommonTools.Constants;
import CommonTools.DesignTools;
import java.awt.CardLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * Левая панель окна заявок
 *
 * @author Salnikov Aleksey
 */
public class LeftDemandPanel extends JPanel{

    protected JRadioButton execRB, notExecRB, allRB;
    protected JRadioButton allTimeRB, lastWeekRB, periodTimeRB, last30Days;
    protected JLabel startL, endL;
    protected JTextField startF, endF;
    protected JPanel periodPanel;
    protected JTable table;
    protected JComboBox adminsCb, adminDemandCmb, adminsRightCb, computersCb;
    protected Admin admin;
    protected boolean first = true;

    public LeftDemandPanel(Admin admin)
    {
        this.admin = admin;

        GridBagLayout gbl = new GridBagLayout();
        gbl.columnWeights = new double [] {1.0};
        gbl.rowWeights = new double [] {0.0,0.0,0.0, 0.0, 1.0};
        gbl.rowHeights = new int[] {0,0,0,0,1};
        gbl.columnWidths = new int [] {2};
        this.setLayout(gbl);
        GridBagConstraints gbcMain = new GridBagConstraints();
        gbcMain.fill = GridBagConstraints.HORIZONTAL;
        gbcMain.anchor = GridBagConstraints.NORTHWEST;

        /*******************************************************
         * Создаем панель со статусом заявки
         ******************************************************/
        JPanel statusPanel = new JPanel();
        statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.Y_AXIS));
        DesignTools.addPanelTitle(statusPanel, "Статус заявки");

        execRB = new JRadioButton("Выполненные");
        notExecRB = new JRadioButton("Не выполненные");
        allRB = new JRadioButton("Все");
        allRB.setSelected(true);

        ButtonGroup statusBG = new ButtonGroup();
        statusBG.add(allRB);
        statusBG.add(execRB);
        statusBG.add(notExecRB);

        statusPanel.add(allRB);
        statusPanel.add(execRB);
        statusPanel.add(notExecRB);

        gbcMain.gridx = 0;
        gbcMain.gridy = 0;

        this.add(statusPanel, gbcMain);

        /*******************************************************
         * Создаем панель сортировки по времени
         ******************************************************/
        JPanel timePanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbcT = new GridBagConstraints();
        timePanel.setLayout(new GridBagLayout());
        DesignTools.addPanelTitle(timePanel, "Время поступления заявки");

        allTimeRB = new JRadioButton("За все время");
        allTimeRB.setSelected(true);
        lastWeekRB = new JRadioButton("За последнюю неделю");
        periodTimeRB = new JRadioButton("За период времени");
        last30Days = new JRadioButton("За последние 30 дней");

        ButtonGroup timeBG = new ButtonGroup();
        timeBG.add(allTimeRB);
        timeBG.add(lastWeekRB);
        timeBG.add(last30Days);
        //timeBG.add(periodTimeRB);

        gbcT.weightx = 0.5;
        gbcT.weighty = 0.5;
        gbcT.gridx = 0;
        gbcT.gridy = 0;
        gbcT.anchor = GridBagConstraints.NORTHWEST;
        timePanel.add(allTimeRB, gbcT);
        gbcT.gridy = 1;
        timePanel.add(lastWeekRB, gbcT);
        gbcT.gridy = 2;
        timePanel.add(last30Days, gbcT);

        periodPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 0.5;
        gbc.weighty = 0.5;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.fill = GridBagConstraints.NONE;

        startL = new JLabel("C:");
        endL = new JLabel("По:");

        startF = new JTextField();
        startF.setEditable(false);
        endF = new JTextField();
        endF.setEditable(false);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.ipadx = 15;
        periodPanel.add(startL, gbc);
        gbc.gridy = 1;
        periodPanel.add(endL, gbc);

        gbc.gridy = 0;
        gbc.gridx = 1;
        gbc.ipadx = 100;
        gbc.fill = gbc.HORIZONTAL;
        periodPanel.add(startF, gbc);
        gbc.gridy = 1;
        periodPanel.add(endF, gbc);
        periodPanel.setVisible(false);

        gbcT.gridy = 3;
        //timePanel.add(periodPanel, gbcT);

        gbcMain.gridy = 1;

        this.add(timePanel, gbcMain);

        /********************************************************
         * Создаем панельку сортировки по администратру
         *******************************************************/
         JPanel adminPanel = new JPanel(new CardLayout());
         DesignTools.addPanelTitle(adminPanel, "Работник");

         adminsCb = new JComboBox();
         Actions.refreshAdminComboBox(adminsCb, first);
         first = false;
         adminsCb.setSelectedIndex(adminsCb.getItemCount() - 1);

         adminPanel.add(adminsCb, "first");

         gbcMain.gridy = 2;
         this.add(adminPanel, gbcMain);

         /*******************************************************
          * Создаем панельку сортировки по компьютеру
          ******************************************************/
         computersCb = new JComboBox();
         Actions.refreshComputers(computersCb);
         computersCb.setSelectedIndex(0);

         JPanel computerPanel = new JPanel(new CardLayout());
         DesignTools.addPanelTitle(computerPanel, "Компьютер");
         computerPanel.add(computersCb, "first");

         gbcMain.gridy = 3;
         this.add(computerPanel, gbcMain);

        /********************************************************
         * Добавляем действия
         *******************************************************/

        periodTimeRB.addChangeListener(new ChangeListener()
            {
                public void stateChanged(ChangeEvent e) {
                    showPeriodPanel();
                }
            });

       startF.addMouseListener(new MouseAdapter()
           {
               @Override
               public void mouseClicked(MouseEvent e)
               {
                    CalendarWindow cw = new CalendarWindow(startF, null);
               }
           });

       endF.addMouseListener(new MouseAdapter()
           {
               @Override
               public void mouseClicked(MouseEvent e)
               {
                    CalendarWindow cw = new CalendarWindow(endF, null);
               }
           });
       //protected JRadioButton execRB, notExecRB, allRB;
       //protected JRadioButton allTimeRB, lastWeekRB, periodTimeRB;

       execRB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       notExecRB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       allRB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       allTimeRB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       lastWeekRB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       last30Days.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       periodTimeRB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) {
                    filterDemands();
                }
            });

       adminsCb.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                filterDemands();
            }
        });

        computersCb.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                filterDemands();
            }
        });
    }

    protected void showPeriodPanel()
    {
        this.periodPanel.setVisible(periodTimeRB.isSelected());
    }

    public JComboBox getComputersCB()
    {
        return this.computersCb;
    }

    public void setTable(JTable table)
    {
        this.table = table;
    }

    public void setAdmin(Admin admin)
    {
        this.admin = admin;
    }

    public JComboBox getComboBoxAdmin()
    {
        return this.adminsCb;
    }

    public void filterDemands()
    {
        int time, admin, status;
        time = 0;
        admin = 0;
        //Устанавливаем статус
        if (allRB.isSelected())
           status = Constants.ALL_DEMANDS;
        else
            if (execRB.isSelected())
                status = Constants.EXECUTE_DEMANDS;
            else
                status = Constants.NOT_EXECUTE_DEMANDS;

        //Устанавливаем время заявки
        if (allTimeRB.isSelected())
            time = Constants.ALL_TIME_DEMANDS;
        else
            if (lastWeekRB.isSelected())
                time = Constants.LAST_WEEK_DEMANDS;
            else
                time = Constants.LAST_30_DAYS_DEMANDS;

        //Устанавливаем администратора
        //if (this.admin.getLogin().equals("root"))
            try
            {
                AdminComboBoxModel acbm = (AdminComboBoxModel) adminsCb.getModel();
                Admin a = acbm.getAdmin(adminsCb.getSelectedIndex());
                admin = a.getId();
            }
            catch (Exception e)
            {
                admin = Constants.ALL_ADMINS;
            }
        //else
            //admin = this.admin.getId();

        //Устанавливаем компьютер
        String pc = "Все компьютеры";
        try
        {
            pc = computersCb.getSelectedItem().toString();
        }
        catch (Exception e) {}

        //Пока что отсылаем заявку на все время и всех админов
        Actions.filterDemands(status, time, admin, pc, table);

        //Теперь обновляем списки администраторов
        //Actions.refreshAdminComboBox(adminsCb);
        //Actions.refreshAdminComboBox(adminsRightCb);
    }

    public void setAdminsrightComboBox(JComboBox box)
    {
        this.adminsRightCb = box;
    }

    public JComboBox getAdminRightCb()
    {
        return this.adminsRightCb;
    }

    public JComboBox getAdminCb()
    {
        return this.adminsCb;
    }

    public JComboBox getComputersCb()
    {
        return this.computersCb;
    }

    public JTable getTable()
    {
        return this.table;
    }

}
